package database;

import graph.DatiJGraph;

import java.sql.*;
import java.util.Vector;

public class Interrogazioni {
	private ConnectionPool cp;
	
	public Interrogazioni() {
		try {
			cp = ConnectionPool.getConnectionPool();
		} catch (ConnectionPoolException e) {
			e.printStackTrace();
		}
	}
	
	// Svuota la tabella connessioni
	public boolean svuotaDatiConnessioni () {
		boolean risposta = false;
		Connection con=null;
		String query = "TRUNCATE TABLE CONNESSIONI;";
        try {
			con = cp.getConnection();
			PreparedStatement ps = con.prepareStatement(query);
			ps.executeUpdate();
			ps.close();
			risposta = true;
		} catch (Exception e) {
			System.err.println ("Errore: " + e);
			risposta = false;
		}
		cp.releaseConnection(con);
		return risposta;
	}

	// Svuota la tabella numero connessioni temporanee
	public boolean svuotaNumeroConnessioni () {
		boolean risposta = false;
		Connection con=null;
		String query = "TRUNCATE TABLE NUMCONNTEMP;";
        try {
			con = cp.getConnection();
			PreparedStatement ps = con.prepareStatement(query);
			ps.executeUpdate();
			ps.close();
			boolean risposta1 = this.inserisciPrimoNumeroConnessione();
			if (!risposta1) {
				System.out.println("ERRORE - Non inserito primo numero di connessioni aperte");
			} else {
				risposta = true;
			}
		} catch (Exception e) {
			System.err.println ("Errore: " + e);
			risposta = false;
		}
		cp.releaseConnection(con);
		return risposta;
	}

	// Inserisce un primo dato totale sulle connessioni aperte
	private boolean inserisciPrimoNumeroConnessione() {
		boolean risposta = false;
		Connection con=null;
		String query = "INSERT INTO NUMCONNTEMP (nomesocket, numero) VALUES(?, ?);";
        try {
			con = cp.getConnection();
			PreparedStatement ps = con.prepareStatement(query);
			ps.setString(1, "total");
			ps.setInt(2, 0);
			ps.executeUpdate();
			ps.close();
			risposta = true;
		} catch (Exception e) {
			System.err.println ("Errore: " + e);
			risposta = false;
		}
		cp.releaseConnection(con);
		return risposta;
	}
	
	/*
	 * ----------------------------------------------------------------------
	 */
	
	public boolean aggiungiNuovaConnessione (String nomeSocket, double tempo, boolean apertura, boolean chiusura) {
		boolean risposta = false;
		Connection con=null;
		String query1 = "UPDATE NUMCONNTEMP SET numero=numero+1 WHERE id=1;";
		String query2 = "INSERT INTO NUMCONNTEMP (nomesocket, numero) VALUES(?, ?);";
		String query3 = "SELECT * FROM NUMCONNTEMP WHERE id=1;";
		String query4 = "INSERT INTO CONNESSIONI (nomesocket, tempo, numeroconn, iniziale, finale) VALUES(?, ?, ?, ?, ?);";
        try {
			con = cp.getConnection();

			Statement s = con.createStatement();
			s.executeUpdate(query1);
			s.close();
			
			PreparedStatement ps1 = con.prepareStatement(query2);
			ps1.setString(1, nomeSocket);
			ps1.setInt(2, 1);
			ps1.executeUpdate();
			ps1.close();
			
			Statement s1 = con.createStatement();
			ResultSet rs1 = s1.executeQuery(query3);
			int numeroConnessioni = -1;
			if (rs1.first()) {
				numeroConnessioni = rs1.getInt("numero");	
			}
			rs1.close();
			s1.close();

			System.out.println("NUOVA CONNESSIONE, Connessioni attive --> " + numeroConnessioni);
			
			PreparedStatement ps = con.prepareStatement(query4);
			ps.setString(1, nomeSocket);
			ps.setDouble(2, tempo);
			ps.setInt(3, numeroConnessioni);
			ps.setBoolean(4, apertura);
			ps.setBoolean(5, chiusura);
			ps.executeUpdate();
			ps.close();

			risposta = true;
		} catch (Exception e) {
			System.err.println ("Errore: " + e);
			risposta = false;
		}
		cp.releaseConnection(con);
		return risposta;
	}
	
	public boolean aggiungiAltraConnessione (String nomeSocket, double tempo, boolean apertura, boolean chiusura) {
		boolean risposta = false;
		Connection con=null;
		String query1 = "UPDATE NUMCONNTEMP SET numero=numero+1 WHERE id=1;";
		String query2 = "UPDATE NUMCONNTEMP SET numero=numero+1 WHERE nomesocket=?;";
		String query3 = "SELECT * FROM NUMCONNTEMP WHERE id=1;";
		String query4 = "INSERT INTO CONNESSIONI (nomesocket, tempo, numeroconn, iniziale, finale) VALUES(?, ?, ?, ?, ?);";
        try {
			con = cp.getConnection();
			
			Statement s = con.createStatement();
			s.executeUpdate(query1);
			s.close();
			
			PreparedStatement ps1 = con.prepareStatement(query2);
			ps1.setString(1, nomeSocket);
			ps1.executeUpdate();
			ps1.close();
			
			Statement s1 = con.createStatement();
			ResultSet rs1 = s1.executeQuery(query3);
			int numeroConnessioni = -1;
			if (rs1.first()) {
				numeroConnessioni = rs1.getInt("numero");	
			}
			rs1.close();
			s1.close();

			System.out.println("ALTRA CONNESSIONE, Connessioni attive --> " + numeroConnessioni);
			
			PreparedStatement ps = con.prepareStatement(query4);
			ps.setString(1, nomeSocket);
			ps.setDouble(2, tempo);
			ps.setInt(3, numeroConnessioni);
			ps.setBoolean(4, apertura);
			ps.setBoolean(5, chiusura);
			ps.executeUpdate();
			ps.close();
			
			risposta = true;
		} catch (Exception e) {
			System.err.println ("Errore: " + e);
			risposta = false;
		}
		cp.releaseConnection(con);
		return risposta;
	}
	
	public boolean rimuoviConnessione (String nomeSocket, double tempo, boolean apertura, boolean chiusura) {
		boolean risposta = false;
		Connection con=null;
		String query1 = "UPDATE NUMCONNTEMP SET numero=numero-1 WHERE id=1;";
		String query2 = "UPDATE NUMCONNTEMP SET numero=numero-1 WHERE nomesocket=?;";
		String query3 = "SELECT * FROM NUMCONNTEMP WHERE id=1;";
		String query4 = "INSERT INTO CONNESSIONI (nomesocket, tempo, numeroconn, iniziale, finale) VALUES(?, ?, ?, ?, ?);";
        try {
			con = cp.getConnection();

			Statement s = con.createStatement();
			s.executeUpdate(query1);
			s.close();
			
			PreparedStatement ps1 = con.prepareStatement(query2);
			ps1.setString(1, nomeSocket);
			ps1.executeUpdate();
			ps1.close();
			
			Statement s1 = con.createStatement();
			ResultSet rs1 = s1.executeQuery(query3);
			int numeroConnessioni = -1;
			if (rs1.first()) {
				numeroConnessioni = rs1.getInt("numero");	
			}
			rs1.close();
			s1.close();

			System.out.println("RIMUOVO CONNESSIONE, Connessioni attive --> " + numeroConnessioni);
			
			PreparedStatement ps = con.prepareStatement(query4);
			ps.setString(1, nomeSocket);
			ps.setDouble(2, tempo);
			ps.setInt(3, numeroConnessioni);
			ps.setBoolean(4, apertura);
			ps.setBoolean(5, chiusura);
			ps.executeUpdate();
			ps.close();
			
			risposta = true;
		} catch (Exception e) {
			System.err.println ("Errore: " + e);
			risposta = false;
		}
		cp.releaseConnection(con);
		return risposta;
	}
	
	public boolean closeConnessione (String nomeSocket, double tempo, boolean apertura, boolean chiusura) {
		boolean risposta = false;
		Connection con=null;
		String query1 = "SELECT * FROM NUMCONNTEMP WHERE id=1;";
		String query2 = "SELECT * FROM NUMCONNTEMP WHERE nomesocket=?;";
		String query3 = "UPDATE NUMCONNTEMP SET numero=? WHERE id=1;";
		String query4 = "INSERT INTO CONNESSIONI (nomesocket, tempo, numeroconn, iniziale, finale) VALUES(?, ?, ?, ?, ?);";
        try {
			con = cp.getConnection();
			
			Statement s = con.createStatement();
			ResultSet rs = s.executeQuery(query1);
			int numeroConnessioniTotali = -1;
			if (rs.first()) {
				numeroConnessioniTotali = rs.getInt("numero");	
			}
			rs.close();
			s.close();

			System.out.println("CLOSE CONNESSIONE, Connessioni attive totali --> " + numeroConnessioniTotali);
			
			PreparedStatement ps1 = con.prepareStatement(query2);
			ps1.setString(1, nomeSocket);
			ResultSet rs1 = ps1.executeQuery();
			int numeroConnessioniSocket = -1;
			if (rs1.first()) {
				numeroConnessioniSocket = rs1.getInt("numero");	
			}
			rs1.close();
			ps1.close();

			System.out.println("CLOSE CONNESSIONE, Connessioni attive socket --> " + numeroConnessioniSocket);
			
			int newNumeroConnessioniTotali = numeroConnessioniTotali - numeroConnessioniSocket;
			
			PreparedStatement ps2 = con.prepareStatement(query3);
			ps2.setInt(1, newNumeroConnessioniTotali);
			ps2.executeUpdate();
			ps2.close();

			PreparedStatement ps = con.prepareStatement(query4);
			ps.setString(1, nomeSocket);
			ps.setDouble(2, tempo);
			ps.setInt(3, newNumeroConnessioniTotali);
			ps.setBoolean(4, apertura);
			ps.setBoolean(5, chiusura);
			ps.executeUpdate();
			ps.close();

			System.out.println("CLOSE CONNESSIONE, Nuove connessioni totali --> " + newNumeroConnessioniTotali);
			
			risposta = true;
		} catch (Exception e) {
			System.err.println ("Errore: " + e);
			risposta = false;
		}
		cp.releaseConnection(con);
		return risposta;
	}
	
	/*
	 * ----------------------------------------------------------------------
	 */
	
	public String getNomePrimaSoxket(){
		String nomePrimaSocket = "";
		int numeroConnessioni = 0;
		Connection con=null;
		ResultSet rs = null;
		String query="SELECT * FROM CONNESSIONI;";
		try {
			con = cp.getConnection();
			Statement s = con.createStatement();
			rs = s.executeQuery(query);
			while(rs.next()){
				if (rs.getBoolean("iniziale")) {
					numeroConnessioni++;
					String nomeSocket = rs.getString("nomesocket");
					
					if (numeroConnessioni == 1) {
						nomePrimaSocket = nomeSocket;
					}
					
				}
			}
			s.close();
			rs.close();
			cp.releaseConnection(con);
			return nomePrimaSocket;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public Vector<DatiJGraph> getConnessioni(){
		Connection con=null;
		ResultSet rs = null;
		Vector<DatiJGraph> connessioni = new Vector<DatiJGraph>();
		String query="SELECT * FROM CONNESSIONI;";
		try {
			con = cp.getConnection();
			Statement s = con.createStatement();
			rs = s.executeQuery(query);
			while(rs.next()){
				if (rs.getBoolean("iniziale")) {
					String nomeSocket = rs.getString("nomesocket");
					int tempo = (int) rs.getDouble("tempo");
					int numeroConnessioni = rs.getInt("numeroconn");
					
					System.out.println("Valore tempo nel grafo: " + tempo);
					
					DatiJGraph djg = new DatiJGraph(nomeSocket, tempo, numeroConnessioni, true, false);
					connessioni.addElement(djg);
				} else if (rs.getBoolean("finale")) {
					String nomeSocket = rs.getString("nomesocket");
					int tempo = (int) rs.getDouble("tempo");
					int numeroConnessioni = rs.getInt("numeroconn");
					
					System.out.println("Valore tempo nel grafo: " + tempo);

					DatiJGraph djg = new DatiJGraph(nomeSocket, tempo, numeroConnessioni, false, true);
					connessioni.addElement(djg);
				}
			}
			s.close();
			rs.close();
			
			cp.releaseConnection(con);
			return connessioni;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
